package com.rzjm.exercise.common.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

/**
 * Created by SqMax on 2018/3/27.
 */
public class MathUtil {

    private static final Double MONEY_RANGE = 0.01;
    /**
     * 比较2个金额是否相等
     * @param d1
     * @param d2
     * @return
     */
    public static Boolean equals(Double d1,Double d2){
        Double result=Math.abs(d1 - d2);
        if (result < MONEY_RANGE) {
            return true;
        } else {
            return false;
        }
    }

    /**
     *  已知2个直角边，求夹角
     * @param a
     * @param b
     * @return
     */
    public static double getAngleByBevel(Double a, Double b){
        double aaa = Math.atan(a / b) * 180 / Math.PI;
        return aaa;
    }

    /**
     * 2个 Int 类型数字 相除 保留2位小数
     *
     * @param a
     * @param b
     * @return
     */
    public static double getDoubleByInt(long a, long b) {
        DecimalFormat df = new DecimalFormat("0.00");
        String num = "0.00";
        if (b > 0) {
            float f = (float) a / b;
            num = df.format(f);
        }
        return Double.parseDouble(num);
    }

    /**
     * 2个 Double 类型数字 相除 保留2位小数
     *
     * @param a
     * @param b
     * @return
     */
    public static double getDoubleByD(double a, double b) {
        DecimalFormat df = new DecimalFormat("0.00");
        String num = "0.00";
        if (b > 0) {
            double f = a / b;
            num = df.format(f);
        }
        return Double.parseDouble(num);
    }

    public static double getDoubleUpThree(double a){
        BigDecimal bg = new BigDecimal(a).setScale(3, RoundingMode.HALF_UP);
        return bg.doubleValue();
    }
    public static double getDoubleUpFour(double a){
        BigDecimal bg = new BigDecimal(a).setScale(4, RoundingMode.HALF_UP);
        return bg.doubleValue();
    }
    /**
     *  对当前小数保留2位
     *
     * @param a
     * @return
     */
    public static double getDouble(double a) {
        DecimalFormat df = new DecimalFormat("0.00");
        String num = "0.00";
        num = df.format(a);
        return Double.parseDouble(num);
    }

    /**
     *  a 占 b 的百分比
     * @param a
     * @param b
     * @return
     */
    public static String getRatio(long a, long b) {
        DecimalFormat df = new DecimalFormat("0.00");
        String num = "0.00";
        if (b > 0) {
            float f = (float) a / b;
            num = df.format(f*100);
        }
        return num;
    }

    /**
     *  根据三角函数  已知角度和点（距离）,求垂直高度
     * @return
     */
    public static double getVerticalLength(double angle, double bevel){
        //角度
//		double angle=45.0;
        //斜边长
        BigDecimal c = BigDecimal.valueOf(bevel);
        //转换为弧度制
        double radians = Math.toRadians(angle);
        //正弦值
        BigDecimal sin = BigDecimal.valueOf(Math.sin(radians));
        //四舍五入保留2位 小数
        sin = sin.setScale(2, BigDecimal.ROUND_HALF_UP);
        //垂直高度  a边长
        BigDecimal a = c.multiply(sin);
        //余弦值
//		BigDecimal cos=BigDecimal.valueOf(Math.cos(radians));
//		//四舍五入保留2位小数
//		cos = cos.setScale(2, BigDecimal.ROUND_HALF_UP);
//		//水平长度  b边长
//		BigDecimal b = c.multiply(cos);
//		System.out.println("sin="+sin+" cos="+cos);
//		System.out.println("a="+a+" b="+b);
        return a.doubleValue();
    }



    /**
     * 直角三角获取斜边
     * @param a 直角边长
     * @param b 直角边长
     * @return 斜边边长
     */
    public static Double getHypotenuseFromLength(double a,double b){
        return Math.sqrt(a*a+b*b);
    }

    /**
     * 直角三角形 根据直角边和斜边求直角边
     * @param right 直角边
     * @param hypotenuse 斜边
     * @return 直角边长
     */
    public static double getRightSideFromLength(double right,double hypotenuse){
        return Math.sqrt(hypotenuse*hypotenuse - right*right);
    }



    public static int getAngleByHeightAndAngle(double height,double radius){
        int aa = getDegree(0, 0, height, radius, height, 0);
        return aa;
    }

    /**
     *
     * @param vertexPointX -- 角度对应顶点X坐标值
     * @param vertexPointY -- 角度对应顶点Y坐标值
     * @param point0X
     * @param point0Y
     * @param point1X
     * @param point1Y
     * @return
     */
    private static int getDegree(double vertexPointX, double vertexPointY, double point0X, double point0Y, double point1X, double point1Y) {
        //向量的点乘
        double vector = (point0X - vertexPointX) * (point1X - vertexPointX) + (point0Y - vertexPointY) * (point1Y - vertexPointY);
        //向量的模乘
        double sqrt = Math.sqrt(
                (Math.abs((point0X - vertexPointX) * (point0X - vertexPointX)) + Math.abs((point0Y - vertexPointY) * (point0Y - vertexPointY)))
                        * (Math.abs((point1X - vertexPointX) * (point1X - vertexPointX)) + Math.abs((point1Y - vertexPointY) * (point1Y - vertexPointY)))
        );
        //反余弦计算弧度
        double radian = Math.acos(vector / sqrt);
        //弧度转角度制
        return (int) (180 * radian / Math.PI);
    }

    private  static int getIn_angle(int x1, int x2, int y1, int y2, int z1, int z2) {
		 /*
          *^y
          *|
           |         /| y点
           |        / |
           |       /  |
          0|--- x点----z点---------->x
           |
          */

        //向量的点乘
        int t =(y1-x1)*(z1-x1)+(y2-x2)*(z2-x2);

        //为了精确直接使用而不使用中间变量
        //包含了步骤：A=向量的点乘/向量的模相乘
        //          B=arccos(A)，用反余弦求出弧度
        //          result=180*B/π 弧度转角度制
        int result =(int)(180 * Math.acos(
                t/Math.sqrt
                        ((Math.abs((y1-x1)*(y1-x1))+Math.abs((y2-x2)*(y2-x2)))
                                *(Math.abs((z1-x1)*(z1-x1))+Math.abs((z2-x2)*(z2-x2)))
                        ))
                /Math.PI);
        //      pi   = 180
        //      x    =  ？
        //====> ?=180*x/pi

        return result;
    }




    public static void main(String[] args) {
        double dd = getVerticalLength(30,10);
        System.out.println("垂直高度: " + dd);
//		double d1 = 10.12;
//		double d2 = 11.123;
//		double d = getDoubleByInt(123,57);
//		double d3 = getDoubleByD(d1,d2);
//		System.out.println(d3);
//
//
//		int aa = ((180 * 10) / 12) * 60;
//		System.out.println("aa:" + aa);
    }
}
